//
//  main.cpp
//  BitOperatorDemo
//
//  Created by DeLong Yang on 2017/8/2.
//  Copyright © 2017年 YiXue. All rights reserved.
/*
    原始博客：http://blog.csdn.net/morewindows/article/details/7354571  这个博客
    写的很详细
    Xcode 完全支持 C++ 编译器
    调用的函数要提前 写好 不然main 函数 无法找到
 */

#include <iostream>
#include <math.h>  // use math function

// we  can see the xcode 使用的是 算术右边移动   不是逻辑右边移动
void simpleTest()
{
    int a = -15;
    int b = 15;
    printf("%d %d\n",a>>2,b>>2);
    
    int c = (1<<3) + 1;  // 对比 指数运算 和 位移运算 的对比 很明显 在某些方面 位移更方便
    printf("c:%d \n",c);
    
    int d = pow(2, 3) + 1;
    printf("d:%d \n",d);
}

//  test oddnumber or not
void isOddNumber ()
{
    // no matter positive or negative it is all right
    // i % 2 == 0
    for (int i =-10 ; i< 10; i++) {
        if (i & 1) { // 是奇数
            printf("is odd num %d",i);
        }
    }
    
}

// change value of two number
void swap (int &a,int &b)
{
    if (a != b) {
        int c = a;
        a = b;
        b = c;
    }
}

// use bit operation
void bitSwap(int &a,int &b)
{
    if (a != b) {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

// 符号变换
int signReversal(int a)
{
    return ~a + 1;
}

//  笔者认为这样。对于 64的 还是 32 的是否区别 ？？？
int my_abs(int a)
{
    int i = a >> 31;
    return  i == 0 ? a: signReversal(a);
}

// the second way to return abs value  this method come from last method
int my_abs_2(int a)
{
    int i = a >> 31;  // get the sign number of a
    return ((a^i) - i);
}

//
const int MAXN = 10;
bool  flag[MAXN] ;
int   primes[MAXN/3+1],pi;

// ????
#pragma mark ---- 没搞明白这个 筛法的意思
void GetPrime_1()
{
    int i, j;
    pi = 0;
    memset(flag, false, sizeof(flag));
    for (i = 2; i < MAXN; i++){
        if (!flag[i]){
            primes[pi++] = i;
            for (j = i; j < MAXN; j += i)
                flag[j] = true;
        }
    }
}

void PrintfArray()
{
    for (int i = 0; i < pi; i++)
        printf("%d ", primes[i]);
    putchar('\n');
}

// set one bit 1。？？？ 没成！！！！
int  setNumberOne(int j)
{
   return  j |= (1<<10);
}

//  获取 某个j 第二位是 0 还是1。？？？？ 没成
int getFirstBit(int j)
{
   int  bit =  (j & (1<<10));
    
    return bit;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, Bit Opetator This is Owsome!\n";
    //
//    simpleTest();
    
    //
//    isOddNumber();
    //
//    int a = 3;
//    int b = 4;
//    swap(a, b);
//    printf("a:%d b:%d",a,b);
//    
//    bitSwap(a, b);   // 二者  调换 后 又换回来
//    printf("a:%d b:%d",a,b);
    //
    
    //
//    int m = 7, n = -123;
//    printf("m: %d -- n: %d \n",signReversal(m),signReversal(n));
    
//    int q = my_abs(-1111111);
//    int v = my_abs_2(-123456);
    
//    GetPrime_1();
//    PrintfArray();
    
    int  j = 8;
    printf("%d \n",setNumberOne(j));
    
    int k = 1;
    printf("--- %d",getFirstBit(k));
    
    
    
    //
    return 0;
}
